package net.xdclass.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;


/**
 * 自定义线程池
 */
@Configuration
@EnableAsync
public class ThreadPoolTaskConfig {

    @Bean("threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程数 即使没有任务需要执行 也会存活
        executor.setCorePoolSize(16);
        //如果设置allowCoreThreadTimeOut为true 默认false，则会允许核心线程会超时 关闭，
        //executor.setAllowCoreThreadTimeOut();

        //阻塞队列 当核心线程数到达最大时（8），新任务会放在队列中排队等待执行
        executor.setQueueCapacity(1024);

        //最大线程池数量 当线程数>=corePoolSize时 且任务队列已满时 线程池会创建新线程来处理任务
        //当任务列已满 且当线程数=maxPoolSize时，线程池会拒绝处理任务并抛出异常
        executor.setMaxPoolSize(64);

        //当线程空闲时间达到keepAliveTime时 线程会退出 直到线程数量=corePoolSize
        //允许线程空闲时间30秒 当maxPoolSize的线程在空闲时间到达的时候销毁
        //如果setAllowCoreThreadTimeout 为true时 则核心线程直到0 被销毁
        executor.setKeepAliveSeconds(30);

        //spring提供的 TheadOPoolTaskExecutor线程池 是有默认的setThreadNamePrefix()方法
        //而jdk的ThreadPoolExecutor没有。
        executor.setThreadNamePrefix("短链项目自定义线程池");

        //拒绝策略
        //抛出RejectedExecutionException异常
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

        //初始化
        executor.initialize();

        return executor;
    }
}
